swadhinbiswas feat: OpenCodeHub v1.1.0 - Enterprise Features & Storage Adapters · 2/15/2026
719a1cb
47 lines · 1.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

import type { APIRoute } from "astro";
import { getDatabase, schema } from "@/db";
import { getUserFromRequest } from "@/lib/auth";
import { success, badRequest, notFound, unauthorized, serverError } from "@/lib/api";
import { eq, desc } from "drizzle-orm";
import { projects, projectColumns, projectCards } from "@/db/schema/projects";
import { logger } from "@/lib/logger";
import { withErrorHandler } from "@/lib/errors";

export const POST: APIRoute = withErrorHandler(async ({ request, params }) => {
    const { id } = params; // project id
    if (!id) return badRequest("Project ID required");

    const user = await getUserFromRequest(request);
    if (!user) return unauthorized();

    const body = await request.json();
    const { columnId, note, contentId, contentType } = body;

    if (!columnId) return badRequest("Column ID is required");
    if (!note && !contentId) return badRequest("Note or content is required");

    const db = getDatabase();

    // Get max order
    const existing = await (db as any).select({ order: projectCards.order })
        .from(projectCards)
        .where(eq(projectCards.columnId, columnId))
        .orderBy(desc(projectCards.order))
        .limit(1);

    const nextOrder = (existing[0]?.order || 0) + 1;

    const [newCard] = await (db as any).insert(projectCards).values({
        id: crypto.randomUUID(),
        columnId,
        note,
        contentId,
        contentType,
        order: nextOrder,
        creatorId: user.id
    }).returning();

    return success(newCard);
});